package com.jmb.demo.Container;

import com.jmb.demo.simple.Pair;

import java.util.Arrays;
import java.util.Random;

/**
 * 泛型类最常见的作用域就是容器类了，所谓容器类就是容纳管理多数据的一个类。
 * 数组就是用来管理多项数据的，但数组有很多限制，比如，长度固定，插入、删除操作效率比较低
 * 下边代码，实现一个简单的容器类，也就是动态数组，然后就是长度可变的数组，底层数组的长度当然不可变，我们提供一个类，好像就是一个长度可变的数据。
 */

public class DynamicArray<E> {
    // 这是一个静态不可以的方法，我们不用管类实例化后在调用，可以直接用。
    private static final int DEFAULT_CAPACITY = 10;
    private int size;
    private Object [] elementData;
    public DynamicArray(){
        this.elementData = new Object[DEFAULT_CAPACITY];
    }
    private void ensureCapacity(int minCapacity){
        int oldCapacity = elementData.length;
        if (oldCapacity>=minCapacity){
            return;
        }
        int newCapacity = oldCapacity * 2;
        if (newCapacity < minCapacity)
            newCapacity=minCapacity;
        elementData = Arrays.copyOf(elementData,newCapacity);
    }
    public void add(E e){
        ensureCapacity(size+1);
        elementData[size++]=e;
    }
    public E get(int index){
        return (E)elementData[index];
    }
    public int size(){
        return size;
    }
    public E set(int index,E element){
        E oldValue = get(index);
        elementData[index] = element;
        return oldValue;
    }

    // 上边的类就是实现一个动态的数组。
    public static void main(String[] args) {
        // 我们来存放Double类型
        DynamicArray<Double> arr = new DynamicArray<>();
        Random rnd = new Random();
        int size = 1+rnd.nextInt(100);
        for (int i = 0; i < size; i++) {
            arr.add(Math.random());
        }
        Double d = arr.get(rnd.nextInt(size));
        // 我们可以来放入，我们在simple文件下写的Pair泛型类
        DynamicArray<Pair<Integer,String>> arr1= new DynamicArray<>();

    }

}
